﻿.syntax unified
.arch armv7-m

#define __STARTUP_CLEAR_BSS


#define __STACK_SIZE 0x400
/* stack 段 */
.section .stack
.align 3
#ifdef __STACK_SIZE
  .equ STACK_SIZE, __STACK_SIZE
#else
  .equ STACK_SIZE, 0x400
#endif
.globl __STACK_TOP
.globl __STACK_LIMIT
__STACK_LIMIT:
  .space STACK_SIZE
  .size __STACK_LIMIT, .-__STACK_LIMIT
__STACK_TOP:
  .size __STACK_TOP, .-__STACK_TOP

/* heap 段 */
.section .heap
.align 3
#ifdef __HEAP_SIZE
  .equ HEAP_SIZE, __HEAP_SIZE
#else
  .equ HEAP_SIZE, 0
#endif
.globl __HEAP_BASE
.globl __HEAP_LIMIT
__HEAP_BASE:
  .if HEAP_SIZE
  .space HEAP_SIZE
  .endif
  .size __HEAP_BASE, .-__HEAP_BASE
__HEAP_LIMIT:
  .size __HEAP_LIMIT, .-__HEAP_LIMIT


.section .isr_vector
.align 2
.globl __isr_vector
__isr_vector:
    .long    __STACK_TOP            /* Top of Stack */
    .long    reset_handler         /* Reset Handler */
    .long    NMI_Handler           /* NMI Handler */
    .long    HardFault_Handler     /* Hard Fault Handler */
    .long    MemManage_Handler     /* MPU Fault Handler */
    .long    BusFault_Handler      /* Bus Fault Handler */
    .long    UsageFault_Handler    /* Usage Fault Handler */
    .long    0                     /* Reserved */
    .long    0                     /* Reserved */
    .long    0                     /* Reserved */
    .long    0                     /* Reserved */
    .long    SVC_Handler           /* SVCall Handler */
    .long    DebugMon_Handler      /* Debug Monitor Handler */
    .long    0                     /* Reserved */
    .long    PendSV_Handler        /* PendSV Handler */
    .long    SysTick_Handler       /* SysTick Handler */


    .size    __isr_vector, . - __isr_vector

.text 
.thumb
.thumb_func
.align 2
.globl reset_handler
.type reset_handler, %function
reset_handler:
  ldr r1, = data_load_addr
  ldr r2, =__data_start
  ldr r3, =__data_end
#if 1
.LC0:
  cmp r2, r3
  ittt lt
  ldrlt r0, [r1], #4
  strlt r0, [r2], #4
  blt .LC0
#else
.LC0:
  subs r3, r2
  ble .LC1
.LC1:
#endif

#ifdef __STARTUP_CLEAR_BSS
  ldr r1, =0
  ldr r2, =0
  movs r0, 0
.LC2:
  cmp     r1, r2
  itt    lt
  strlt   r0, [r1], #4
  blt    .LC2
#endif   /* __STARTUP_CLEAR_BSS */

#ifndef __NO_SYSTEM_INIT
  bl SystemInit
  b main
#endif

.macro    def_default_handler    handler_name
.align 1
.thumb_func
.weak    \handler_name
.type    \handler_name, %function
\handler_name :
b    .
.size    \handler_name, . - \handler_name
.endm
def_default_handler    NMI_Handler
def_default_handler    HardFault_Handler
def_default_handler    MemManage_Handler
def_default_handler    BusFault_Handler
def_default_handler    UsageFault_Handler
def_default_handler    SVC_Handler
def_default_handler    DebugMon_Handler
def_default_handler    PendSV_Handler
def_default_handler    SysTick_Handler
def_default_handler    Default_Handler

    .end
